# vim: et ts=4 sts=4 sw=4 tw=0
# 设置示例程序列表，每个示例对应一个子目录和同名的 .cpp 文件
set(EXAMPLES
    readFromString
    readFromStream
    stringWrite
    streamWrite
)

# 定义宏 _GLIBCXX_USE_CXX11_ABI，用于指定使用 C++11 ABI
# 这在使用 GCC 编译器时，能确保使用 C++11 标准的 ABI
add_definitions(-D_GLIBCXX_USE_CXX11_ABI)

# 根据不同的编译器添加不同的编译选项和定义宏
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    # 对于 GCC 和 Clang 编译器，添加 -Wall 和 -Wextra 选项
    # -Wall 开启所有常见的编译警告，-Wextra 开启更多额外的警告
    add_compile_options(-Wall -Wextra)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    # 对于 MSVC 编译器，定义一系列宏来抑制特定的警告
    add_definitions(
        # 抑制标准模板库（STL）安全相关的警告
        -D_SCL_SECURE_NO_WARNINGS
        # 抑制 CRT 安全相关的警告
        -D_CRT_SECURE_NO_WARNINGS
        # 指定 Windows 最低版本为 Windows 7
        -D_WIN32_WINNT=0x601
        # 抑制 Winsock 弃用相关的警告
        -D_WINSOCK_DEPRECATED_NO_WARNINGS
    )
endif()

# 遍历示例程序列表，为每个示例创建可执行文件
foreach(example ${EXAMPLES})
    # 创建可执行文件，源文件为对应子目录下的同名 .cpp 文件
    add_executable(${example} ${example}/${example}.cpp)
    # 为可执行文件添加公共包含目录，指向项目的 include 目录
    target_include_directories(${example} PUBLIC ${CMAKE_SOURCE_DIR}/include)
    # 将可执行文件与 jsoncpp_lib 库进行链接
    target_link_libraries(${example} jsoncpp_lib)
endforeach()

# 创建一个名为 examples 的自定义目标，该目标依赖于所有示例程序
# ALL 关键字表示该目标默认会被构建
add_custom_target(examples ALL DEPENDS ${EXAMPLES})
